#include "mySort.h" 
#include <iostream> 
#include <string> 

// 默认构造函数，初始化成员变量
MySort::MySort() {
    this->num = 0; this->origin = NULL;
}

// 带参数的构造函数，用于初始化排序数组
MySort::MySort(int num1, int* origin) {
    this->num = num1; // 设置数组的大小
    this->origin = new int(num); // 动态分配内存存储数组
    for (int i = 0; i < num; i++) { // 复制数组内容到成员变量
        this->origin[i] = origin[i];
    }
}

// 析构函数，用于释放动态分配的内存
MySort::~MySort() {
    if (!origin) { delete[]origin; } // 如果num不为0，释放内存
}

// 交换两个整数的值
void MySort::changeSwap(int& a, int& b) {
    int temp = a;
    a = b; b = temp;
}

// 将数组转换为字符串，用于打印
string MySort::printNum() {
    string result;
    for (int i = 0; i < this->num - 1; i++) {
        result += std::to_string(this->origin[i]) + " "; // 将数组元素转换为字符串并添加空格
    }
    result += std::to_string(this->origin[num - 1]) + '\n'; // 最后一个元素后不加空格，换行
    return result;
}

// 实现奇偶交换排序
string MySort::paritySort() {
    bool swapped;
    string result;
    do {
        swapped = false;
        for (int i = 1; i < this->num; i += 2) { // 从第二个元素开始，步长为2（奇数索引）
            if (i + 1 < this->num && this->origin[i] > this->origin[i + 1]) { // 如果当前元素大于下一个元素，则交换
                changeSwap(this->origin[i], this->origin[i + 1]);
                swapped = true;
                result += printNum(); // 交换后打印当前数组状态
            }
        }
        for (int i = 0; i < this->num; i += 2) { // 从第一个元素开始，步长为2（偶数索引）
            if (i + 1 < this->num && this->origin[i] > this->origin[i + 1]) { // 如果当前元素大于下一个元素，则交换
                changeSwap(this->origin[i], this->origin[i + 1]);
                swapped = true;
                result += printNum(); // 交换后打印当前数组状态
            }
        }
    } while (swapped); // 如果发生了交换，则继续下一轮排序
    return result;
}

// 实现双向冒泡排序
string MySort::bubbleSort() {
    bool swapped;
    int start = 0;
    int end = this->num - 1;
    string result;
    do {
        swapped = false;
        for (int i = start; i < end; i++) { // 从数组开始到倒数第二个元素
            if (this->origin[i] > this->origin[i + 1]) { // 如果当前元素大于下一个元素，则交换
                changeSwap(this->origin[i], this->origin[i + 1]);
                swapped = true;
                result += printNum(); // 交换后打印当前数组状态
            }
        }
        end--; // 将终点向前移动一位
        for (int i = end - 1; i >= start; i--) { // 从倒数第二个元素到数组开始
            if (this->origin[i] > this->origin[i + 1]) { // 如果当前元素大于下一个元素，则交换
                changeSwap(this->origin[i], this->origin[i + 1]);
                swapped = true;
                result += printNum(); // 交换后打印当前数组状态
            }
        }
        start++; // 将起点向后移动一位
    } while (swapped); // 如果发生了交换，则继续下一轮排序
    return result;
}